package stack.easy;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

/**
 * 1. 什么是栈?
 *      所谓的栈，指的是一种先进后出的线性结构，是一种常见的数据结构
 *
 * 2. 栈的使用场景?
 *      在实际生活中的例子:
 *          1. 手枪的弹夹，先放进去的子弹在弹夹的下面所以后射击出来，而后放入弹夹的子弹在上面先射击出来
 *          2. 火车存放货物，一般而言先从货车里面开始向外存放，所以先存放的获取后取出，后存放的货物先取出
 *          3. 复合表达式的求解也需要利用栈结构
 *      栈的主要操作两个：
 *          进栈
 *          出栈
 *
 * 3. JDK底层封装的栈结构的优缺点?
 *      1. class Stack<E> extends Vector<E>   Stack是线程安全的(因为继承Vecoter)，所以其效率不高
 *         不推荐使用这种比较老的结构，查看源码也发现，并不鼓励我们使用stack，而是用如下代替
 *         Deque<Integer> stack = new ArrayDeque<Integer>();
 *
 *      2. interface Deque<E> extends Queue<E>   接口类型
 *         常用的实现类：
 *              1. 链表实现的栈
 *                  class LinkedList<E> extends AbstractSequentialList<E>
 *                  implements List<E>, Deque<E>, Cloneable, java.io.Serializable
 *              2. 数组实现的栈
 *                  class ArrayDeque<E> extends AbstractCollection<E>
 *                  implements Deque<E>, Cloneable, Serializable
 *              3.  双向链表实现的栈 是线程安全的 其线程安全没有通过锁机制，而是通过CAS+自旋实现的
 *                  class ConcurrentLinkedDeque<E> extends AbstractCollection<E>
 *                  implements Deque<E>, java.io.Serializable {
 */
@SuppressWarnings("all")
public class JDK提供的栈结构的比较 {
    public static void main(String[] args) {
        Stack stack = new Stack();
        Deque deque = new ArrayDeque();
        Deque<Integer> stack1 = new LinkedList<>();
    }
}
